----------------------------------------------
-- Lua 面板管理类
----------------------------------------------
local Module = {}
ViewManager = Module

-- 打开一个UI窗体
function Module:OpenPanel(viewsInfo, callback)
    -- print(viewsInfo.script,viewsInfo.prefab)
    require(viewsInfo.script):Show(viewsInfo.prefab)
    -- 打开UI面板后回调
    if callback then
        callback()
    end
end

-- 关闭指定的UI窗体【views_info:Views里的参数】
-- 在某个界面关闭其他界面的时候调用
function Module:ClosePanel(viewsInfo)
    UIManager:ClosePanel(viewsInfo.prefab)
end
-- 关闭当前的UI窗体【name:UI预制体的路径】
-- 在某个界面且需要关闭当前界面的时候可自身调用
function Module:CloseCurrentlyPanel(name)
    UIManager:ClosePanel(name)
end

-- 加载显示UI面板并初始化数据(这个方法不要乱改!!!)
-- 以下是所有窗体的默认配置参数(C#中配置的)，可单独修改某个参数
-- _IsModalForm = false,
-- _PlayAudio = true,
-- _ChangeSceneClose = true,
-- _AnyOtherClickClose = false,
-- _OpenAndCloseOther = false,
-- _NotCloseByOther = false,
-- _AudioEffect = {gValue.DEFAULT_CLICK_OPEN_AUDIO, gValue.DEFAULT_CLICK_CLOSE_AUDIO},
-- _MaskColor = MaskColor.Lucency,
-- _FormType = UIFormType.Normal,
-- _CloseMode = UICloseMode.Hide,
-- _DTAnimIn = DTAnimEffect.FadeIn,
-- _DTAnimOut = DTAnimEffect.FadeOut,
-- _AnimSpeed = DTAnimSpeed.Normal,
-- _COUICloseWillDo = COUICloseWillDo.DoNothing
function Module:ShowFormAndInit(view, formPath, config)
    config = config or {}
    local form = UIManager:InitAndGetPanel(formPath)

    --[[仅UI第一次加载执行，初始化数据--]]
    if not form._IsLoadAndShow then
        -- 初始化该窗口 必须要有的代码
        form:Init(config)
        -- 保存当前form(BaseUIView)和gameObject
        view.form = form
        view.gameObject = form.gameObject
        -- UI窗口的路径
        view.formPath = formPath
        -- 保存的对象节点
        view.NL = Tool:DicToTable(form._NodeList)
        -- 初始化调用脚本初始化其他数据
        view:Init()
    end
    -- 显示该UI窗口
    UIManager:ShowPanel(form)

    -- 打开界面时需要执行的代码
    if view["OnOpen"] then
        view:OnOpen()
    end
end

-- 获取游戏物体上的组件
function Module:GetComponent(view, nodeName, _type)
    local nd = view.NL[nodeName]
    local tf = typeof(_type)
    return nd:GetComponent(tf)
end

-- 设置CS.UnityEngine.UI.Text的文本信,node_name与view对应
-- 即node_name必须是view.NL中持有的游戏对象名字
-- 即BaseUIView._NodeList字典中持有的游戏对象
function Module:SetText(view, nodeName, showTxt)
    local t = Module:GetComponent(view, nodeName, CSUI.Text)
    t.text = showTxt
end

-- 添加点击事件监听
function Module:AddClickEvent(view, nodeName, callback)
    local com = Module:GetComponent(view, nodeName, CSUI.Button)
    -- 保存监听引用
    Tool:AddCSReference(view.formPath, com.onClick)
    -- 添加点击事件监听
    com.onClick:AddListener(callback)
end

-- 添加Slider值改变的事件监听
function Module:AddSliderValueChangeEvent(view, nodeName, callback)
    local com = Module:GetComponent(view, nodeName, CSUI.Slider)
    -- 保存监听引用
    Tool:AddCSReference(view.formPath, com.onValueChanged)
    -- 添加Slider值改变的事件监听
    com.onValueChanged:AddListener(callback)
end


